package admin_menu_api

import (
	"blog_go/global"
	"blog_go/models"
	"blog_go/models/ctype"
	"blog_go/models/res"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"gorm.io/gorm"
)

type MenuAddReq struct {
	Title        string      `json:"title" binding:"required" msg:"请完善菜单名称"`
	Path         string      `json:"path" binding:"required"  msg:"请完善菜单路劲"`
	Slogan       string      `json:"slogan"`
	Abstract     ctype.Array `json:"abstract"`
	AbstractTime int         `json:"abstract_time"`                         // 简介切换的时间 单位秒
	ImageTime    int         `json:"image_time"`                            // 切换的事件
	Sort         int         `json:"sort" binding:"required" msg:"请完善菜单序号"` // 菜单序号
	ImageIdList  []uint      `json:"image_id_list"`                         // 图片的序号
}

func (AdminMenuApi) MenuAdd(c *gin.Context) {
	var req MenuAddReq
	if err := c.ShouldBind(&req); err != nil {
		logrus.Error(err)
		panic(err)
	}
	menuAdd := models.MenuModel{
		Title:        req.Title,
		Path:         req.Path,
		Slogan:       req.Slogan,
		Abstract:     req.Abstract,
		AbstractTime: req.AbstractTime,
		ImageTime:    req.ImageTime,
		Sort:         req.Sort,
	}
	// 重复的判断
	var count int64
	global.DB.Model(&models.MenuModel{}).Where("title = ? AND path = ?", menuAdd.Title, menuAdd.Path).Count(&count)
	if count > 0 {
		panic("重复的菜单")
	}
	// 需要放在一个事物里面
	err := global.DB.Transaction(func(tx *gorm.DB) error {
		// 创建菜单数据入库
		if err := tx.Create(&menuAdd).Error; err != nil {
			return err
		}
		// 第三张表建立关联关系 slice直接申明是nil
		var menu2ImageList []models.Menu2ImageModel
		for index, val := range req.ImageIdList {
			// 严谨一点这里需要判断是否存在image
			menuImage := models.Menu2ImageModel{
				MenuID:  menuAdd.ID,
				ImageID: val,
				Sort:    index + 1,
			}
			// append函数可以接受nil的切片
			menu2ImageList = append(menu2ImageList, menuImage)
		}
		if err := tx.Create(&menu2ImageList).Error; err != nil {
			return err
		}
		return nil
	})
	if err != nil {
		logrus.Error(err)
		panic(err)
	}
	res.OkWithDate(true, c)
}
